{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "from xgboost import XGBClassifier\n",
    "import xgboost as xgb\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.model_selection import StratifiedKFold\n",
    "from sklearn.metrics import log_loss\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "# load Data\n",
    "train = pd.read_csv('train.csv')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>bathrooms</th>\n",
       "      <th>bedrooms</th>\n",
       "      <th>price</th>\n",
       "      <th>price_bathrooms</th>\n",
       "      <th>price_bedrooms</th>\n",
       "      <th>room_diff</th>\n",
       "      <th>room_num</th>\n",
       "      <th>Year</th>\n",
       "      <th>Month</th>\n",
       "      <th>Day</th>\n",
       "      <th>...</th>\n",
       "      <th>walk</th>\n",
       "      <th>walls</th>\n",
       "      <th>war</th>\n",
       "      <th>washer</th>\n",
       "      <th>water</th>\n",
       "      <th>wheelchair</th>\n",
       "      <th>wifi</th>\n",
       "      <th>windows</th>\n",
       "      <th>work</th>\n",
       "      <th>interest_level</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1.5</td>\n",
       "      <td>3</td>\n",
       "      <td>3000</td>\n",
       "      <td>1200.000000</td>\n",
       "      <td>750.000000</td>\n",
       "      <td>-1.5</td>\n",
       "      <td>4.5</td>\n",
       "      <td>2016</td>\n",
       "      <td>6</td>\n",
       "      <td>24</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1.0</td>\n",
       "      <td>2</td>\n",
       "      <td>5465</td>\n",
       "      <td>2732.500000</td>\n",
       "      <td>1821.666667</td>\n",
       "      <td>-1.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>6</td>\n",
       "      <td>12</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1.0</td>\n",
       "      <td>1</td>\n",
       "      <td>2850</td>\n",
       "      <td>1425.000000</td>\n",
       "      <td>1425.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>4</td>\n",
       "      <td>17</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1.0</td>\n",
       "      <td>1</td>\n",
       "      <td>3275</td>\n",
       "      <td>1637.500000</td>\n",
       "      <td>1637.500000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>4</td>\n",
       "      <td>18</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1.0</td>\n",
       "      <td>4</td>\n",
       "      <td>3350</td>\n",
       "      <td>1675.000000</td>\n",
       "      <td>670.000000</td>\n",
       "      <td>-3.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>4</td>\n",
       "      <td>28</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>2.0</td>\n",
       "      <td>4</td>\n",
       "      <td>7995</td>\n",
       "      <td>2665.000000</td>\n",
       "      <td>1599.000000</td>\n",
       "      <td>-2.0</td>\n",
       "      <td>6.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>4</td>\n",
       "      <td>19</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>1.0</td>\n",
       "      <td>2</td>\n",
       "      <td>3600</td>\n",
       "      <td>1800.000000</td>\n",
       "      <td>1200.000000</td>\n",
       "      <td>-1.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>4</td>\n",
       "      <td>27</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>2.0</td>\n",
       "      <td>1</td>\n",
       "      <td>5645</td>\n",
       "      <td>1881.666667</td>\n",
       "      <td>2822.500000</td>\n",
       "      <td>1.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>4</td>\n",
       "      <td>13</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>1.0</td>\n",
       "      <td>1</td>\n",
       "      <td>1725</td>\n",
       "      <td>862.500000</td>\n",
       "      <td>862.500000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>4</td>\n",
       "      <td>20</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>2.0</td>\n",
       "      <td>4</td>\n",
       "      <td>5800</td>\n",
       "      <td>1933.333333</td>\n",
       "      <td>1160.000000</td>\n",
       "      <td>-2.0</td>\n",
       "      <td>6.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>4</td>\n",
       "      <td>2</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>10 rows × 228 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   bathrooms  bedrooms  price  price_bathrooms  price_bedrooms  room_diff  \\\n",
       "0        1.5         3   3000      1200.000000      750.000000       -1.5   \n",
       "1        1.0         2   5465      2732.500000     1821.666667       -1.0   \n",
       "2        1.0         1   2850      1425.000000     1425.000000        0.0   \n",
       "3        1.0         1   3275      1637.500000     1637.500000        0.0   \n",
       "4        1.0         4   3350      1675.000000      670.000000       -3.0   \n",
       "5        2.0         4   7995      2665.000000     1599.000000       -2.0   \n",
       "6        1.0         2   3600      1800.000000     1200.000000       -1.0   \n",
       "7        2.0         1   5645      1881.666667     2822.500000        1.0   \n",
       "8        1.0         1   1725       862.500000      862.500000        0.0   \n",
       "9        2.0         4   5800      1933.333333     1160.000000       -2.0   \n",
       "\n",
       "   room_num  Year  Month  Day       ...        walk  walls  war  washer  \\\n",
       "0       4.5  2016      6   24       ...           0      0    0       0   \n",
       "1       3.0  2016      6   12       ...           0      0    0       0   \n",
       "2       2.0  2016      4   17       ...           0      0    0       0   \n",
       "3       2.0  2016      4   18       ...           0      0    0       0   \n",
       "4       5.0  2016      4   28       ...           0      0    1       0   \n",
       "5       6.0  2016      4   19       ...           0      0    0       0   \n",
       "6       3.0  2016      4   27       ...           0      0    0       0   \n",
       "7       3.0  2016      4   13       ...           0      0    1       0   \n",
       "8       2.0  2016      4   20       ...           0      0    0       0   \n",
       "9       6.0  2016      4    2       ...           0      0    0       0   \n",
       "\n",
       "   water  wheelchair  wifi  windows  work  interest_level  \n",
       "0      0           0     0        0     0               1  \n",
       "1      0           0     0        0     0               2  \n",
       "2      0           0     0        0     0               0  \n",
       "3      0           0     0        0     0               2  \n",
       "4      0           0     0        0     0               2  \n",
       "5      0           0     0        0     0               1  \n",
       "6      0           0     0        0     0               2  \n",
       "7      0           0     0        0     0               2  \n",
       "8      0           0     0        0     0               1  \n",
       "9      0           0     0        0     0               2  \n",
       "\n",
       "[10 rows x 228 columns]"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train.head(10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(49352, 228)"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train.shape\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 1.1提取标签y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "\n",
    "y_train = train['interest_level']\n",
    "train = train.drop(['interest_level'], axis =1)\n",
    "X_train = np.array(train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "# prepare cross validation\n",
    "kfold = StratifiedKFold(n_splits=5, shuffle=True, random_state=3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 直接调用xgboost内嵌的交叉验证\n",
    "def modelfit(alg, X_train, y_train, cv_folds=None, early_stopping_rounds=10):\n",
    "    xgb_param = alg.get_xgb_params()#获取xgb参数\n",
    "    xgb_param['num_class'] = 3 #xgb分类的参数\n",
    "    \n",
    "    xgtrain = xgb.DMatrix(X_train, label= y_train)\n",
    "    \n",
    "    cvresult = xgb.cv(xgb_param, xgtrain, num_boost_round=alg.get_xgb_params()['n_estimators'], folds =cv_folds,\n",
    "                     metrics='mlogloss', early_stopping_rounds=early_stopping_rounds)\n",
    "    cvresult.to_csv('3_nestimators.csv', index_label = 'n_estimators')\n",
    "    \n",
    "    # 最佳参数n_estimators\n",
    "    n_estimators = cvresult.shape[0]\n",
    "    \n",
    "    #用交叉验证得到最佳参数，训练模型\n",
    "    alg.set_params(n_estimators = n_estimators)\n",
    "    alg.fit(X_train, y_train, eval_metric='mlogloss')\n",
    "    #train_predprob = alg.predict_proba(X_train)\n",
    "    #logloss = log_loss(y_train, train_predprob)\n",
    "    #print('logloss of train:', logloss)\n",
    "    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "xgbl = XGBClassifier(\n",
    "        learning_rate=0.1,\n",
    "        n_estimators=1000,#第一次226，第二次332\n",
    "        max_depth=4,\n",
    "        min_child_weight=0.5,\n",
    "        gamma=0,\n",
    "        subsample=0.8,\n",
    "        colsample_bytree=0.8,\n",
    "        colsample_bylevel=0.7,\n",
    "        reg_alpha=1,\n",
    "        reg_lambda=0.01,\n",
    "        objective= 'multi:softprob',\n",
    "        seed=3)\n",
    "modelfit(xgbl, X_train, y_train, cv_folds = kfold)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0xbc56e80>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "cvresult = pd.DataFrame.from_csv('3_nestimators.csv')\n",
    "\n",
    "test_means = cvresult['test-mlogloss-mean']\n",
    "test_stds = cvresult['test-mlogloss-std']\n",
    "train_means = cvresult['train-mlogloss-mean']\n",
    "train_stds = cvresult['train-mlogloss-std']\n",
    "\n",
    "x_axis = range(0, cvresult.shape[0])\n",
    "\n",
    "plt.errorbar(x_axis, test_means, yerr=test_stds, label='Test')\n",
    "plt.errorbar(x_axis, train_means, yerr=train_stds, label='train')\n",
    "plt.title('XGBoost n_estimators vs log-loss')\n",
    "plt.xlabel('n_estimators')\n",
    "plt.ylabel('log-loss')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "first_time:由图可知，当n_estimators超过100后就趋于稳定了。从表格里看到达到226便停止，所以我选择n_estimators=226此时的得分为0.59213\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "second_time:将reg_alpha=1,reg_lambda=0.01,max_depth=5,min_child_weight=1,subsample=0.8,colsample_bytree=0.8带入进去.此时得分0.5841(n_estimator=332)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Third_time:max_depth=4,\n",
    "        min_child_weight=0.5，\n",
    "        subsample=0.8,\n",
    "        colsample_bytree=0.8,\n",
    "        colsample_bylevel=0.7,\n",
    "        reg_alpha=1,\n",
    "        reg_lambda=0.01\n",
    "此时得分0.5848(n_estimators=514)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "所以调参最优结果是 learning_rate=0.1,\n",
    "        n_estimators=332,\n",
    "        max_depth=4,\n",
    "        min_child_weight=0.5,\n",
    "        gamma=0,\n",
    "        subsample=0.8,\n",
    "        colsample_bytree=0.8,\n",
    "        colsample_bylevel=0.7,\n",
    "        reg_alpha=1,\n",
    "        reg_lambda=0.01\n",
    "得分为0.5841"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "总结：感觉在参数上的调整，整体下来的结果不会有质的飞跃，个人觉得想要让结果有质的飞跃可能就需要在特征工程方面以及一些其他方法了。"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
